# 面向对象的核心在于 类

# 面向对象 三大特征 封装 继承 多态

# 类 是对于有共同特征的一类的抽象   人类

# 固有属性 和 行为
# 属性 (只有一份的类属性,  类实例化(具体化,根据类生成一个类的实例)之后的对象都不同的属性,叫做对象属性)    方法

class People:
    head_mount = 1  # 类属性

    def __init__(self, name, age):  # 通过init方法定义了对象属性
        self.name = name
        self.age = age

    def play(self):
        print(self.name, 'play........')

    @classmethod
    def huxi(cls):  # cls 表示这个类
        print('呼吸........')
        print(cls.head_mount)

    @staticmethod
    def fun():
        print('我是一个静态方法.........')


p1 = People('zhangsan', 29)  # 实例化一个类,生成一个对象
print(p1)
print(p1.name)  # 对象.属性
print(p1.age)

p1.play()

print(p1.head_mount)

print(People.head_mount)  # 类名.类属性

p2 = People('lisi', 77)
print(p2.age)
print(p2.name)
print(p2.head_mount)

People.huxi()  # 类名.类方法()

p2.huxi()  # 对象也可以调用

p2.fun()
People.fun()


# 学生 --特殊的人类,除了人类共同的特征,还有  学习

class Student(People):

    def study(self):
        print('wo zai xue xi......')


s1 = Student('小明', 12)
print(s1.name)
s1.fun()
s1.play()

s1.study()


# 鸭子模式, 一个东西,看起来,走起来,叫起来,把这个东西当成鸭子

class A:
    def play(self):
        print('a ...play........')


# 本意测试让人玩..
def fun1(ob):
    ob.play()


print('*' * 20)
fun1(p1)
fun1(s1)  # 多种形态

a = A()

fun1(a)  # 鸭子类型
